請求 ( request ) 是爬蟲程式的起點,可以說是沒有請求,就沒有後面的程式碼
換句話說,一個有 input 和 output 的程式,你可能很習慣 input 來自於鍵盤的讀取、檔案系統,或者資料庫,而爬蟲程式的 input 就來自於「網路」
鍵盤的讀取、檔案系統,或者資料庫同時也可以以網路的形式傳入
而這邊指的網路,代表爬蟲的 input 是由 request 拿到的 response
HTTP 協定是一個一來一往的交流,當你發起請求給伺服器,伺服器處理完畢後,也會給你一個回應,代表著英文的 request and response
而發起請求的方式相當簡單,當你打開瀏覽器,輸入網址後送出,並且看到 HTML 被解析成精美的網頁畫面時,你已經完成了一個請求
話說穿了,請求就是一個 HTTP 封包的發送和返回,所以你不見得只能用瀏覽器瀏覽網頁,你可以用 curl 或 wget 這種 Linux 原生的工具去瀏覽網頁
如果你會寫 HTTP 封包的話,你甚至可以用 Python 去瀏覽網頁對吧 ? 這也是為什麼會有網路爬蟲的誕生
不過在現代幾乎沒有人直接去寫 HTTP 封包本身,而是選擇用更高階的 HTTP 函式庫去處理爬蟲
這裡衍伸出一個問題 : 什麼程式語言都可以寫網路爬蟲嗎 ?
HTTP 是建立在 TCP 協定之上的應用層協定,而 socket 又是 TCP 的 API,所以只要你的程式語言能寫 socket,就能寫網路爬蟲
但就像我說的,大家都是使用 HTTP 函式庫在撰寫爬蟲,所以在選擇語言上,應該優先考慮該語言有沒有 HTTP 函式庫可用
我認為 Python 是一個相當適合做爬蟲的程式語言,這是我在比較過各種語言的 HTTP 函式庫後得出的結論
HTTP/1.1 請求方法一共有 8 種,分別是 GET、HEAD、POST、、PUT、DELETE、TRACE、OPTIONS 和 CONNECT,其中最常用的是 GET 和 POST
在不需要認證的情況下,GET 對爬蟲來說是最容易實作的,因為只要請求就一定能拿到回應
需要認證的情況和 POST 就相較複雜許多,可謂爬蟲程式裡的千變萬化
RESTful API 是一種設計風格,充分利用了 HTTP 請求方法的動詞去達成 API 格式的設計
比方說以下 4 種方法,分別可以代表 user 在資料庫裡面的 CRUD
取得 user GET /user
新增 user POST /user
更新 user PUT /user
刪除 user DELETE /user
HTTP 狀態碼會是一個三位數,第一個數字代表著回應的類型
1xx 代表請求正常,用戶端應該繼續完成請求
2xx 代表請求正常
3xx 代表重新導向
4xx 代表客戶端錯誤
5xx 代表伺服器端錯誤
常見的 HTTP 狀態碼有 200 代表請求正常 ; 301 或 302 代表重新導向 ; 403 代表無權限存取 ; 404 代表找不到這個網頁資源 ; 500 代表伺服器端錯誤
200 也會被稱作 200 OK,不過對爬蟲來說,有時候 200 並不見得是真正的沒問題
比方說,有一個 GET 頁面需要登入才看得見,沒有登入的情況下 GET 則會被重導向到登入頁面,其實回應碼通常也會是 200
即使整個請求過程沒有錯誤,但卻不能光靠 200 就判斷我們請求的頁面沒有問題
301 或 302 重新導向,有一個最直接的狀況
在大部份有規模的網站,你刻意在網址列使用 HTTP 而非 HTTPS 去連線,你通常會被重導向回 HTTPS 連線
403 無權限存取的狀況非常多變,比方說自架網頁伺服器的時候,只是因為檔案系統的權限沒有設定好,也會導致 403
這種錯誤通常可以在 log file 裡面發現 Permission denied 的訊息
403 也有可能是使用者真的觸碰到網頁伺服器的禁止規則,或者因為各種原因,被網站 ban 掉
404 就是那耳熟能詳的 404 Not Found,只要你請求到一個完全不存在的網頁,你就會得到 404
404 通常會回傳網頁伺服器預設的 404 頁面,很多網站也會自己客製化專屬的 404 頁面